#pragma once
#include "String.h"
#include "Log4Cpp.h"
#include <SDL.h>

using namespace std;

#ifndef M_PI
#define M_PI	3.141592654
#endif

//define genericamente el aspecto de un elemento, puede ser una textura por imagen o un color
class Textura
{
public:
	SDL_Surface *imagen;
	Textura(String idT, String p); //constructor de textura por textura en si misma
	Textura(String); //construtor de textura con color RGB
	~Textura(void);
	void	cargar(); // Cargar la imagen SDL
	void	cargar(int radio);
	void	cargar(int base, int altura);
	String	GetPath();
	String	GetIdTextura();
	void	aplicarEnPosicion(SDL_Surface *screen,SDL_Rect destino);
	void	setPath(String Path);
	void	setidTextura(String IdTextura);

	int		getBlueChannel(void);
	int		getGreenChannel(void);
	int		getRedChannel(void);

	int		getBlueChannelLinea(void);
	int		getGreenChannelLinea(void);
	int		getRedChannelLinea(void);

	int		setRGB (String);    //devuelve 0 si fue todo correcto, en otro caso es error
	void    setRGB (int blue, int green, int red);

	int		setRGBLinea(String linea);
	void    setRGBLinea (int blue, int green, int red);


	virtual String toString();
	inline  SDL_Surface* getImagen(){ return this->imagen;}
	void    redimensionar(double escalaNuevaSobreVieja);
	void	redimensionar(double relacionAlto, double relacionAncho);
	void    rotXY(int *x, int *y, int anchoFigura, int largoFigura, double gradAngle);
	void	Textura::rotar(double angulo);
	Textura* Textura::Clone();
	void	rotarDesdeOrigen(double angulo);

private:
	enum colores {R, G, B};
	
	String path;
	String id;
	int red;
	int green;
	int blue;

	int redLinea;
	int greenLinea;
	int blueLinea;
	void PutPixel(SDL_Surface *superficie, int x, int y, Uint32 pixel);
	void Rellenar(void);
	Uint32 GetPixel(SDL_Surface *superficie, int x, int y);
	double anguloCuadrante(double x, double y);
	bool   EstaDentro(int x, int y,int radio);
	bool   esContorno(int x, int y,int radio);
	void   sdlACartesiano(int *x, int *y, int ancho, int alto, int radio);
	void   cartesianoAsdl(int *x, int *y, int ancho, int alto, int radio);
};
